Для анализа и визуализации были выбраны данные о пассажиропотоках в метрополитене Нью-Йорка (https://data.cityofnewyork.us/NYC-BigApps/Traffic-Volume-Counts-2012-2013-/p424-amsu). На этом этапе нам, к сожалению, не удалось найти данные о каком-либо российском метрополитене.
Схема метрополитена выглядит следующим образом:
import IPython.display
IPython.display.Image('NYC_subway-4D.png')
Здесь представлены подготовка данных и визуализация нагрузки на 4 станции линии L метрополитена.
# Загружаем необходимые библиотеки
import numpy as np
import pandas as pd
import holoviews as hv
import matplotlib.pyplot as plt
import itertools
import warnings
%matplotlib notebook
%load_ext holoviews.ipython
# Загружаем данные
data = pd.read_csv('Traffic_Volume_Counts__2012-2013_.csv', parse_dates=['Date'])
data.head(2)
# Выбираем только те данные, которые относятся к выбранным нами станциям
L_line_stations = [
'UNION STREET',
'UNION AVE',
'BEDFORD AVENUE',
'LORIMER ST',
'LORIME ST',
'LORIME ST ',
'JEFFERSON AVE',
]
L_line_data = data[(data['From'].isin(L_line_stations)) | (data['To'].isin(L_line_stations))]
# Исправляем неточности в названиях станций в таблице
with warnings.catch_warnings():
warnings.simplefilter("ignore")
L_line_data['From'][:] = L_line_data['From'].str.replace('UNION AVE', 'UNION STREET')
L_line_data['To'][:] = L_line_data['To'].str.replace('UNION AVE', 'UNION STREET')
L_line_data['From'][:] = L_line_data['From'].str.replace('LORIME ST', 'LORIMER ST')
L_line_data['To'][:] = L_line_data['To'].str.replace('LORIME ST', 'LORIMER ST')
L_line_data['To'][:] = L_line_data['To'].str.replace('LORIME ST ', 'LORIMER ST')
L_line_data['From'][:] = L_line_data['From'].str.replace('LORIME ST ', 'LORIMER ST')
L_line_data['From'][L_line_data['From']=='LORIMER ST '] = 'LORIMER ST'
L_line_data['To'][L_line_data['To']=='LORIMER ST '] = 'LORIMER ST'
hours_index = range(24)
days_index = pd.date_range(L_line_data['Date'].min(), L_line_data['Date'].max())
routes = L_line_data[['From', 'To']].drop_duplicates()
routes_index = pd.MultiIndex.from_tuples(zip(routes.values[:, 0], routes.values[:, 1]))
L_line_panel = pd.Panel(items=hours_index, major_axis=days_index, minor_axis=routes_index, dtype=int)
L_line_panel.iloc[:, :, :] = 0
with warnings.catch_warnings():
warnings.simplefilter("ignore")
L_line_data['route'] = zip(L_line_data['From'], L_line_data['To'])
for day, route in itertools.product(days_index, routes_index):
day = pd.Timestamp(day)
if L_line_data[(L_line_data['route']==route) & (L_line_data['Date']==day)].size == 0:
pass
else:
series = pd.Series(L_line_data[(L_line_data['route']==route) & (L_line_data['Date']==day)].iloc[0, 7:7+24].values, index=hours_index)
L_line_panel.loc[:, day, route].iloc[:] = series.astype(int)
L_line_stations = [
'UNION STREET',
'BEDFORD AVENUE',
'LORIMER ST',
'JEFFERSON AVE',
]
L_stations_visitors_dataset = pd.Panel(items=hours_index, major_axis=days_index, minor_axis=L_line_stations, dtype=int)
L_stations_visitors_dataset.loc[:, :, :] = 0
# Находим количество пассажиров, побывавших на станции
for hour, day, station in itertools.product(hours_index, days_index, L_line_stations):
L_stations_visitors_dataset.loc[hour, day, station] = \
L_line_panel.loc[hour, day, L_line_panel.minor_axis.get_level_values(0) == station].sum() + \
L_line_panel.loc[hour, day, L_line_panel.minor_axis.get_level_values(1) == station].sum()
# Будем рассматривать только зависимость количества пассажиров от времени суток
# (просуммируем по дате за весь рассматриваемый период)
dataset = L_stations_visitors_dataset.sum(axis=1)
dataset
Изобразим на схеме метрополитена пассажиропоток на станциях за весь период с помощью цвета:
%%opts Layout [aspect_weight=1.0] Overlay [fig_size=1000 aspect=3] Points [color_index=2 size_index=3 scaling_factor=100] Points style(cmap='autumn')
image = hv.RGB.load_image('NYC_subway_L.png', array=True)
rgb = hv.RGB(image)
points_array = np.array([
[-0.25, 0.35, 0, 1],
[-0.07, 0.35, 0, 1],
[-0.015, 0.36, 0, 1],
[0.16, 0.38, 0, 1],
])
holomap = hv.HoloMap(kdims=['hour'])
for hour in range(24):
pa = points_array.copy()
pa[:, 2] = dataset[hour]
points_el = hv.Points(pa, vdims=['z', 'alpha'])
holomap[hour] = rgb * points_el
holomap